<?php
    if (!defined('__IS_LEAF__')) exit('Access Denied!');
    
    /**
     * 模块基类
     */
    class Service extends Base {

        /**
         * 无法被继承的构造方法，意味着用户自定义service不能使用构造方法，但是可以使用init方法，再有就是空业务层不和dao进行关联
         */
        final public function __construct(){
            //获取用户的service名
            /*$userService  = get_called_class();
            //将用户service解析出表名
            $tableName = $this->parseToTableName($userService);
            P($tableName);
            parent::__construct($tableName);*/
            $this->init();
        }

        /**
         * 可被继承的init方法，用于用户自定义初始化方法
         */
        public function init(){

        }

        /**
         * 该方法是为了支持在Service中调用$this知己诶可以操作对应的表而存在的，不过后来取消了，因为容易让使用者混乱
         * 如果想支持上上面注释的功能，首先继承改为Dao，然后启用构造方法中的注释
         * 解析类如UserConnectService字符串为表名称
         */
        final protected function parseToTableName($userService){
            $serviceStr = substr_replace($userService, '', -7, 7);
            $serviceStr = lcfirst($serviceStr);
            //判断参数类型的合法性
            if(!is_string($serviceStr)) $this->error(L('param').'$serviceStr'.L('must_string'));
            //将userNotifyDao这种形式，转换为 prefix_user_notify或prefix_usernotify等形式的表模型
            $callArr = explode('Dao', $serviceStr);
            $callArr = array_filter($callArr);
            $tableStr = $callArr[0];
            //获取真实表名，如果为userNotify这种中间有大写的形式，则转为user_notify的形式
            //先用大写分割，然后转为小写，最后重新拼接
            $tempArr = preg_split( "/(?=[A-Z])/", $tableStr);
            foreach ($tempArr as $key => &$value) {
                $value = strtolower($value);
            }
            $tableName = C('db_prefix').implode('_', $tempArr);
            return $tableName;
        }


    }
